package myapp.helper;

import java.util.ArrayList;

import android.location.Location;

import myapp.DTO.ServiceDTO;

public class OrientationHelper {
	
	private static double curLon = 106.682692;	
	
	private static double curLat = 10.763928;
	
	public static void setCurLatLon(double curLat, double curLon) {
		OrientationHelper.curLat = curLat;
		OrientationHelper.curLon = curLon;
		android.util.Log.i("OrientationHelper", "setCurLatLon");
		//Cap nhat location user
	}
	
	public static double getCurLon() {
		return curLon;
	}

	public static void setCurLon(double curLon) {
		OrientationHelper.curLon = curLon;
	}

	public static double getCurLat() {
		return curLat;
	}

	public static void setCurLat(double curLat) {
		OrientationHelper.curLat = curLat;
	}
	
//	static 	public double curLat = 11.763928;
	/*
	 * Tinh khoang cach(m) giua 2 toa do
	 * Input e.g. 40.7486, -73.9864, 40.7486, -73.9864
	 * Output 968900 m
	 * Su dung Haversine formula
	 */
	static public double CalculateDistanceBetweenTwoPoints(double longitude01, double latitude01, double longitude02, double latitude02)
	{
		Location start = new Location("LocationStart");
		Location dest = new Location("LocationDest");
		
		start.setLatitude(latitude01);
		start.setLongitude(longitude01);
		dest.setLatitude(latitude02);
		dest.setLongitude(longitude02);
		
		return start.distanceTo(dest);
	}
	
	/*
	 * Ham tim ra cac service trong pham vi goc degreeView theo huong cua thiet bi degreeNorth
	 * Tra ve danh sach ServiceDTO
	 * degreeNorth la gia tri Yaw: goc quay theo truc z
	 */
	static public ArrayList<ServiceDTO> getServicesByOrientation(double longitude, double latitude, ArrayList<ServiceDTO> services, float degreeNorth, float degreeView)
	{
		ArrayList<ServiceDTO> returnServices = new ArrayList<ServiceDTO>();
		
		for (int i = 0; i < services.size(); i++)
			if (isServiceInsideView(longitude, latitude, services.get(i), degreeNorth, degreeView))
					returnServices.add(services.get(i));
		
		return returnServices;
	}
	
	static public boolean isServiceInsideView (double longitude, double latitude, ServiceDTO service, float degreeNorth, float degreeView)
	{
		double lon = longitude;
		double lat = latitude;
		if (service.getLongitude() == lon && service.getLatitude() == lat)			
			return true;
		else
		{
/*				double x = services.get(i).getLongitude() - lon;
			double y = services.get(i).getLatitude() - lat;
			double temp = Math.atan2(y, x)/Math.PI*180;
			if (x<0 && y >0)
				temp = 180-temp;
			if (x<0 && y<0)
				temp = -temp-270;
			if (x>0 && y<0)
				temp = 90 - temp;
			double degree;
			degree = temp - degreeNorth;
			if ((temp - degreeNorth) > 180)
			{
				degree = temp - degreeNorth - 360;
			}
			if ((temp - degreeNorth) < -180)
			{
				degree = 360 - (-(temp - degreeNorth));
			}*/
			
			double alpha_degree = getDegreeOrientationDeviceWithService(longitude, latitude, service, degreeNorth);
			
			if (Math.abs(alpha_degree) < degreeView/2)
				return true;
		}
		return false;
	}


	/**
	 * Hàm trả về góc giữa hướng của 1 dich vụ và hướng của thiết bị
	 * @param longitude: Kinh độ của thiết bị
	 * @param latitude: Vĩ độ của thiết bị
	 * @param service: biến kiểu ServiceDTO chứa thông tin tọa độ của dịch vụ
	 * @param degreeNorth: là giá trị Yaw - góc quay quanh trục z
	 * @return trả về giá trị góc trong khoảng (-pi, pi]
	 */
	static public double getDegreeOrientationDeviceWithService(double longitude, double latitude, ServiceDTO service, float degreeNorth)
	{
		double x = service.getLongitude() - longitude;
		double y = service.getLatitude() - latitude;
		
		double temp = Math.atan2(x, y)/Math.PI*180;
		
/*		double temp = Math.atan2(y, x)/Math.PI*180;
		if (x<0 && y >0)	// Góc phần tư thứ hai
			temp = 180-temp;
		if (x<0 && y<0)		// Góc phần tư thứ ba
			temp = -temp-270;
		if (x>0 && y<0)		// Góc phần tư thứ tư
			temp = 90 - temp;*/
		
		double degree;
		if (temp - degreeNorth > 180)
			degree = (temp - degreeNorth) - 360;
		else if (temp - degreeNorth < -180)
			degree = 360 - (-(temp - degreeNorth));
		else 
			degree = temp - degreeNorth;
		return degree;
	}
}
